import { ReceiveMessageType } from "@/core/config/DeclareGlobal";

/**
 * 消息接收类，用于处理与Unity或其他外部应用的消息通信
 */
class ReceiveMessage {
  /**
   * 事件监听器对象，存储所有注册的事件监听器
   * @private
   * @type {Object<string|number, Function[]>}
   */
  #eventObj = {};

  constructor() {
    window.addEventListener("message", (ev) => {
      if (this.#eventObj[ev.data.type]) {
        // 调用所有注册的监听器
        this.#eventObj[ev.data.type].forEach((callback) => {
          try {
            callback(ev.data);
          } catch (error) {
            console.error("Error in event listener:", error);
          }
        });
      }
    });
  }

  /**
   * 执行指定事件的所有监听器
   * @param {ReceiveMessageType} eventKey - 事件类型键名
   * @param {any} data - 要传递给监听器的数据
   */
  executeEvent(eventKey, data) {
    if (this.#eventObj[eventKey]) {
      // 调用所有注册的监听器
      this.#eventObj[eventKey].forEach((callback) => {
        try {
          callback(data);
        } catch (error) {
          console.error("Error in event listener:", error);
        }
      });
    }
  }

  /**
   * 添加事件监听器
   * @param {ReceiveMessageType} eventKey - 事件的键名，用于标识事件类型
   * @param {Function} callback - 事件触发时调用的回调函数
   */
  addListener(eventKey, callback) {
    if (!this.#eventObj[eventKey]) {
      this.#eventObj[eventKey] = [];
    }
    this.#eventObj[eventKey].push(callback);
  }

  /**
   * 移除事件监听器
   * @param {ReceiveMessageType} eventKey - 事件的键名
   * @param {Function} callback - 要移除的回调函数
   */
  removeListener(eventKey, callback) {
    if (this.#eventObj[eventKey]) {
      const index = this.#eventObj[eventKey].indexOf(callback);
      if (index > -1) {
        this.#eventObj[eventKey].splice(index, 1);
      }
    }
  }

  /**
   * 检查是否存在指定类型的事件监听器
   * @param {ReceiveMessageType} eventKey - 事件的键名
   * @returns {boolean} 是否存在监听器
   */
  hasListener(eventKey) {
    return !!this.#eventObj[eventKey] && this.#eventObj[eventKey].length > 0;
  }

  /**
   * 获取指定事件类型的监听器数量
   * @param {ReceiveMessageType} eventKey - 事件的键名
   * @returns {number} 监听器数量
   */
  getListenerCount(eventKey) {
    return this.#eventObj[eventKey] ? this.#eventObj[eventKey].length : 0;
  }
}

// 创建单例实例
const receiveMessage = new ReceiveMessage();
export default receiveMessage;
